Importation et préparation des données

Les données fournit étaient stocké dans un fichier excel que nous avons convertis en fichier csv plus pratique à importer dans R. L’importation des données se fait à l’aide de l’appel suivante :

Data <- read.csv("Car2DB_fra_cut.csv", sep = ";", encoding = "UTF-8", na.strings = c("", "NA", "#N/A", " "), dec = ",")

Pour la préparation des données, nous avons réaliser une fonction permettant dans un premier temps de nettoyer les noms de colonne à l’aide du package janitor. Ensuite nous avons fait en sorte de supprimer les colonnes ayant un nombre de valeurs manquantes supérieur à un cinquième du nombre d’observations dans le dataset. Dans notre cas nous enlèverons donc les colonnes ayant plus de 311 valeurs manquantes. Cela nous permet d’ensuite supprimer les lignes ayant des valeurs manquantes. Si nous avions supprimer les lignes ayant des valeurs manquantes sans gérer les précédentes colonnes, le dataset aurait été vide.

L’appel suivant permet de nettoyer nos données :

source("scripts/generalist_cleaning.R")
Data <- clean(Data)

Pour la suite du devoir, nous n’utiliserons que les variables suivantes :

data_utilise <- Data[c("cylindree_cm3", "puissance_de_moteur_ch", "longueur_mm", "largeur_mm", "poids_a_vide_kg", "vitesse_max_km_h")]
head(data_utilise)
##    cylindree_cm3 puissance_de_moteur_ch longueur_mm largeur_mm poids_a_vide_kg
## 20           954                     50        3525       1555             705
## 21          1124                     60        3525       1555             691
## 22          1294                     95        3525       1595             735
## 23          1361                     75        3517       1596             820
## 25          1361                     52        3525       1555             735
## 26          1361                     95        3515       1595             795
##    vitesse_max_km_h
## 20              151
## 21              167
## 22              186
## 23              165
## 25              155
## 26              186

Normalisation des données

Pour cette partie, nous avons réalisé une fonction nous permettant de centrer et réduire nos données.

source("scripts/centrer_reduire.R")
donnees <- centrer_reduire(data_utilise)
head(donnees)
##    cylindree_cm3 puissance_de_moteur_ch longueur_mm largeur_mm poids_a_vide_kg
## 20    -1.7434287             -1.8609718   -2.309935  -2.579601       -2.117328
## 21    -1.4186591             -1.6241682   -2.309935  -2.579601       -2.164240
## 22    -1.0938896             -0.7953555   -2.309935  -2.087453       -2.016801
## 23    -0.9658921             -1.2689628   -2.332044  -2.075150       -1.731976
## 25    -0.9658921             -1.8136111   -2.309935  -2.579601       -2.016801
## 26    -0.9658921             -0.7953555   -2.337571  -2.087453       -1.815748
##    vitesse_max_km_h
## 20     -1.801497275
## 21     -0.978614165
## 22     -0.001440472
## 23     -1.081474554
## 25     -1.595776497
## 26     -0.001440472

On peut comparer le résultat obtenu avec la fonction scale de R permettant de normaliser les données.

data_scale <- scale(data_utilise)
head(data_scale)
##    cylindree_cm3 puissance_de_moteur_ch longueur_mm largeur_mm poids_a_vide_kg
## 20    -1.7434287             -1.8609718   -2.309935  -2.579601       -2.117328
## 21    -1.4186591             -1.6241682   -2.309935  -2.579601       -2.164240
## 22    -1.0938896             -0.7953555   -2.309935  -2.087453       -2.016801
## 23    -0.9658921             -1.2689628   -2.332044  -2.075150       -1.731976
## 25    -0.9658921             -1.8136111   -2.309935  -2.579601       -2.016801
## 26    -0.9658921             -0.7953555   -2.337571  -2.087453       -1.815748
##    vitesse_max_km_h
## 20     -1.801497275
## 21     -0.978614165
## 22     -0.001440472
## 23     -1.081474554
## 25     -1.595776497
## 26     -0.001440472

Corrélation entre deux variables

Pour cette partie nous avons tout d’abord une fonction permettant de réaliser un nuage de points. Ensuite, pour faciliter le travail et aller plus vite, nous avons fait une fonction appelant la fonction nuageDePoints précédemment créée et réalisant une regression simple pour chaque couple de variables possibles.

source("scripts/correlation.R")
all_regression_simple(data_utilise)

## [1] "equation de la droite : 563.98 + 10.13 * puissance_de_moteur_ch + 301.81"
## [1] "coefficient de determination :  0.668"

## [1] "equation de la droite : -2431.02 + 0.99 * longueur_mm + 383.39"
## [1] "coefficient de determination :  0.464"

## [1] "equation de la droite : -6041.09 + 4.48 * largeur_mm + 376.16"
## [1] "coefficient de determination :  0.484"

## [1] "equation de la droite : -6.73 + 1.4 * poids_a_vide_kg + 315"
## [1] "coefficient de determination :  0.638"

## [1] "equation de la droite : -453.16 + 12.47 * vitesse_max_km_h + 464.15"
## [1] "coefficient de determination :  0.215"

## [1] "equation de la droite : 5.52 + 0.07 * cylindree_cm3 + 24.35"
## [1] "coefficient de determination :  0.668"

## [1] "equation de la droite : -220.24 + 0.08 * longueur_mm + 30.77"
## [1] "coefficient de determination :  0.47"

## [1] "equation de la droite : -552.16 + 0.39 * largeur_mm + 28.3"
## [1] "coefficient de determination :  0.551"

## [1] "equation de la droite : -11.64 + 0.1 * poids_a_vide_kg + 28.36"
## [1] "coefficient de determination :  0.549"

## [1] "equation de la droite : -166.78 + 1.59 * vitesse_max_km_h + 28.83"
## [1] "coefficient de determination :  0.534"

## [1] "equation de la droite : 3481.8 + 0.47 * cylindree_cm3 + 265.03"
## [1] "coefficient de determination :  0.464"

## [1] "equation de la droite : 3605.64 + 5.87 * puissance_de_moteur_ch + 263.62"
## [1] "coefficient de determination :  0.47"

## [1] "equation de la droite : -2163.73 + 3.7 * largeur_mm + 201.67"
## [1] "coefficient de determination :  0.69"

## [1] "equation de la droite : 3109.17 + 0.94 * poids_a_vide_kg + 230.04"
## [1] "coefficient de determination :  0.596"

## [1] "equation de la droite : 2387.51 + 10.61 * vitesse_max_km_h + 297.46"
## [1] "coefficient de determination :  0.325"

## [1] "equation de la droite : 1563 + 0.11 * cylindree_cm3 + 58.41"
## [1] "coefficient de determination :  0.484"

## [1] "equation de la droite : 1580.91 + 1.43 * puissance_de_moteur_ch + 54.47"
## [1] "coefficient de determination :  0.551"

## [1] "equation de la droite : 951.19 + 0.19 * longueur_mm + 45.3"
## [1] "coefficient de determination :  0.69"

## [1] "equation de la droite : 1434.94 + 0.25 * poids_a_vide_kg + 34.49"
## [1] "coefficient de determination :  0.82"

## [1] "equation de la droite : 1412.13 + 1.9 * vitesse_max_km_h + 72.48"
## [1] "coefficient de determination :  0.206"

## [1] "equation de la droite : 486.7 + 0.46 * cylindree_cm3 + 179.59"
## [1] "coefficient de determination :  0.638"

## [1] "equation de la droite : 663.28 + 5.24 * puissance_de_moteur_ch + 200.41"
## [1] "coefficient de determination :  0.549"

## [1] "equation de la droite : -1440.29 + 0.64 * longueur_mm + 189.72"
## [1] "coefficient de determination :  0.596"

## [1] "equation de la droite : -4530.88 + 3.33 * largeur_mm + 126.64"
## [1] "coefficient de determination :  0.82"

## [1] "equation de la droite : 352.64 + 5.29 * vitesse_max_km_h + 280.28"
## [1] "coefficient de determination :  0.119"

## [1] "equation de la droite : 153.91 + 0.02 * cylindree_cm3 + 17.24"
## [1] "coefficient de determination :  0.215"

## [1] "equation de la droite : 142.74 + 0.34 * puissance_de_moteur_ch + 13.27"
## [1] "coefficient de determination :  0.534"

## [1] "equation de la droite : 52.46 + 0.03 * longueur_mm + 15.98"
## [1] "coefficient de determination :  0.325"

## [1] "equation de la droite : -5.36 + 0.11 * largeur_mm + 17.34"
## [1] "coefficient de determination :  0.206"

## [1] "equation de la droite : 156 + 0.02 * poids_a_vide_kg + 18.26"
## [1] "coefficient de determination :  0.119"

Matrice de corrélation :

cor(data_utilise)
##                        cylindree_cm3 puissance_de_moteur_ch longueur_mm
## cylindree_cm3              1.0000000              0.8172517   0.6812528
## puissance_de_moteur_ch     0.8172517              1.0000000   0.6854168
## longueur_mm                0.6812528              0.6854168   1.0000000
## largeur_mm                 0.6957913              0.7424665   0.8304828
## poids_a_vide_kg            0.7988961              0.7412638   0.7721745
## vitesse_max_km_h           0.4632038              0.7310604   0.5700047
##                        largeur_mm poids_a_vide_kg vitesse_max_km_h
## cylindree_cm3           0.6957913       0.7988961        0.4632038
## puissance_de_moteur_ch  0.7424665       0.7412638        0.7310604
## longueur_mm             0.8304828       0.7721745        0.5700047
## largeur_mm              1.0000000       0.9055963        0.4533558
## poids_a_vide_kg         0.9055963       1.0000000        0.3447143
## vitesse_max_km_h        0.4533558       0.3447143        1.0000000

Analyse en composante principale

Dans cette partie nous allons appliquer la méthode ACP et analyser les résultats sur les plans (1,2), (1,3) et (2,3). La méthode PCA() du package FactoMineR normalise automatiquement les données, il n’est donc pas nécessaire de réaliser cette transformation avant l’ACP.

La fonction ACP() que nous avons réalisé affiche le pourcentage d’information par axe via un graphe et retourne le résultat de la fonction PCA()

source("scripts/acp.R")

res.pca <- ACP(data_utilise)

Pour les questions 6, 7 et 8 nous allons les réaliser par plan.

Axes (1,2)

fviz_pca_ind(res.pca, axes = c(1,2))
fviz_pca_var(res.pca, axes = c(1,2))

Le plan (1,2) nous montre 87.5% d’information ce qui est très bien. On remarque que les variables longueur_mm, cylindree_cm3, largeur_mm, poids_a_vide_kg et puissance_de_moteur_ch sont positivement corrélées les unes aux autres. En revanche poids_a_vide_kg et vitesse_max_km_h ne sont pas corrélées, on pouvait déjà le voir dans la partie précédente.

Au niveau de la typologie des véhicules on aurait :

  • les véhicules petites et légères qui auraient donc besoin de moins de puissance moteur et de moins de cylindrée
  • les véhicules plus grandes donc plus lourdes et qui ont besoin de plus de puissance moteur et de cylindrée

Les ressemblances sont donc fondées sur la puissance du moteur, la longueur, la largeur, la cylindrée et le poids à vide.

Axes (1,3)

fviz_pca_ind(res.pca, axes = c(1,3))
fviz_pca_var(res.pca, axes = c(1,3))

Le plan (1,3) nous montre 81.1% d’information ce qui est aussi très bien. On remarque que toutes les variables sont positivement corrélées sauf vitesse_max_km_h qui n’est pas assez bien représenté pour en conclure quelque chose.

La typologie des véhicules est similaire au plan précédant :

  • les véhicules petites et légères qui auraient donc besoin de moins de puissance moteur et de moins de cylindrée
  • les véhicules plus grandes donc plus lourdes et qui ont besoin de plus de puissance moteur et de cylindrée

Les ressemblances sont aussi fondées sur les mêmes variables que précédemment, la puissance du moteur, la longueur, la largeur, la cylindrée et le poids à vide.

Ces similiratées avec le plan précédent sont dûes au fait que l’axe 1, commun aux deux plans, explique la quasi totalité des deux plans (74.2%).

Axes (2,3)

fviz_pca_ind(res.pca, axes = c(2,3))
fviz_pca_var(res.pca, axes = c(2,3))

Ce plan nous donne très peu d’information, seulement 20.2%. Par ailleurs aucune variable n’est bien représenté dans le cercle des corrélations, on ne peut donc rien en conclure.

Graphe 3D

La fonction suivante nous permet d’avoir un graphe en 3D avec les trois premières dimensions:

library(plotly)

fig3d <- plot_ly(x = res.pca$ind$coord[,1], 
        y = res.pca$ind$coord[,2], 
        z = res.pca$ind$coord[,3])

fig3d <- fig3d %>% add_markers()
fig3d <- fig3d %>% layout(scene = list(xaxis = list(title = 'Dim 1'),
                                    yaxis = list(title = 'Dim 2'),
                                    zaxis = list(title = 'Dim 3')))
fig3d

Nous avons ensuite décidé d’utliser la méthode de K-means afin d’avoir trois groupes d’individus.

res.kmeans <- kmeans(res.pca$ind$coord, 3)

fig3d.kmeans <- plot_ly(x = res.pca$ind$coord[,1], 
        y = res.pca$ind$coord[,2], 
        z = res.pca$ind$coord[,3],
        color=factor(res.kmeans$cluster))

fig3d.kmeans <- fig3d.kmeans %>% add_markers()
fig3d.kmeans <- fig3d.kmeans %>% layout(scene = list(xaxis = list(title = 'Dim 1'),
                                    yaxis = list(title = 'Dim 2'),
                                    zaxis = list(title = 'Dim 3')))
fig3d.kmeans

ACP supplémentaire

Pour cette dernière partie nous allons rajouté les variables garde_au_sol_mm, acceleration_0_100_km_h_seconde, couple_maximal_n_m et reservoir_l.

data_acp_sup <- Data[c("cylindree_cm3", "puissance_de_moteur_ch", "longueur_mm", "largeur_mm", "poids_a_vide_kg", "vitesse_max_km_h", "garde_au_sol_mm", "acceleration_0_100_km_h_seconde", "couple_maximal_n_m", "reservoir_l")]
head(data_acp_sup)
##    cylindree_cm3 puissance_de_moteur_ch longueur_mm largeur_mm poids_a_vide_kg
## 20           954                     50        3525       1555             705
## 21          1124                     60        3525       1555             691
## 22          1294                     95        3525       1595             735
## 23          1361                     75        3517       1596             820
## 25          1361                     52        3525       1555             735
## 26          1361                     95        3515       1595             795
##    vitesse_max_km_h garde_au_sol_mm acceleration_0_100_km_h_seconde
## 20              151             110                            17.0
## 21              167             110                            12.0
## 22              186             110                             9.4
## 23              165             140                            12.0
## 25              155             110                            14.3
## 26              186             110                             9.9
##    couple_maximal_n_m reservoir_l
## 20                 73          43
## 21                 88          43
## 22                113          43
## 23                116          43
## 25                 84          43
## 26                120          43
res.pca.sup <- ACP(data_acp_sup)

Axes (1,2)

fviz_pca_ind(res.pca.sup, axes = c(1,2))
fviz_pca_var(res.pca.sup, axes = c(1,2), labelsize = 3)

Dans ce plan nous pouvons voir que les variables cylindree_cm3, puissance_de_moteur_ch, longueur_mm, largeur_mm, poids_a_vide_kg, reservoir_l et couple_maximal_n_m sont positivement corrélées, les variables vitesse_max_km_h et acceleration_0_100_km_h_seconde sont inversement corrélées et vitesse_max_km_h et garde_au_sol_mm ne sont pas corrélées.

Clustering

res.kmeans.sup <- kmeans(res.pca.sup$ind$coord, 3)

fig3d.sup <- plot_ly(x = res.pca.sup$ind$coord[,1], 
        y = res.pca.sup$ind$coord[,2], 
        z = res.pca.sup$ind$coord[,3],
        color=factor(res.kmeans.sup$cluster))
fig3d.sup <- fig3d.sup %>% add_markers()
fig3d.sup <- fig3d.sup %>% layout(scene = list(xaxis = list(title = 'Dim 1'),
                                    yaxis = list(title = 'Dim 2'),
                                    zaxis = list(title = 'Dim 3')))
fig3d.sup